package com.xc.hotelmgr.webapi.modules.op.service.impl;

import com.google.common.collect.Lists;
import com.xc.hotelmgr.webapi.common.utils.R;
import com.xc.hotelmgr.webapi.modules.op.entity.DtUpHtlEntity;
import com.xc.hotelmgr.webapi.modules.op.entity.GroupDto;
import com.xc.hotelmgr.webapi.modules.op.entity.HtlGroupEntity;
import com.xc.hotelmgr.webapi.modules.op.service.DtUpHtlService;
import com.xc.hotelmgr.webapi.modules.op.service.HtlGroupService;
import lombok.RequiredArgsConstructor;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xc.hotelmgr.webapi.common.utils.PageUtils;
import com.xc.hotelmgr.webapi.common.utils.Query;
import com.xc.hotelmgr.webapi.modules.op.dao.GroupDao;
import com.xc.hotelmgr.webapi.modules.op.entity.GroupEntity;
import com.xc.hotelmgr.webapi.modules.op.service.GroupService;


@Service("groupService")
@RequiredArgsConstructor
public class GroupServiceImpl extends ServiceImpl<GroupDao, GroupEntity> implements GroupService {

    private final DtUpHtlService dtUpHtlService;

    private final HtlGroupService htlGroupService;

    private final GroupDao groupDao;

    @Override
    public PageUtils queryPage(Map<String, Object> params) {
        IPage<GroupEntity> page = this.page(
                new Query<GroupEntity>().getPage(params),
                new QueryWrapper<GroupEntity>()
        );

        return new PageUtils(page);
    }

    @Override
    public PageUtils sqlQueryPage(Map<String, Object> params) {
        IPage<GroupEntity> page = new Query<GroupEntity>().getPage(params);
        List<GroupEntity> list = baseMapper.sqlQuery(params);
        PageUtils pageUtils = new PageUtils(page,list);
        return pageUtils;
    }
    @Override
    public List<GroupEntity> sqlQuery(Map<String, Object> params) {

        List<GroupEntity> list = baseMapper.sqlQuery(params);
        return list;
    }

    @Override
    public R save(GroupDto groupDto) {
        Map<String,Object> params = new HashMap<>();
        params.put("storId",groupDto.getStorId());
        params.put("province",groupDto.getProvince());
        params.put("city",groupDto.getCity());
        params.put("county",groupDto.getCounty());
        params.put("brand",groupDto.getBrand());
        String msg = "";
        // 保存分组信息
        GroupEntity groupEntity  = new GroupEntity();
        groupEntity.setDtId(Integer.valueOf(groupDto.getDtId()));
        groupEntity.setBlonPlantform(Integer.valueOf(groupDto.getPf()));
        groupEntity.setStoreId(Integer.valueOf(groupDto.getStorId()));
        groupEntity.setGroupName(groupDto.getGroupName());
        List<HtlGroupEntity> htlGroupEntities = null;
        HtlGroupEntity htlGroupEntity = null;
        Long id = null;
        //保存分组下包含的酒店信息
        //按指定条件分组酒店
        List<DtUpHtlEntity> dtUpHtlEntities = new ArrayList<>();
        if(groupDto.getGroupType().equals("1")) {
            htlGroupEntities = Lists.newArrayList();
            List<DtUpHtlEntity> hotels = dtUpHtlService.sqlQueryByStore(params);
            if(hotels == null || hotels.size() <= 0){
                return  R.error("没有满足条件的酒店");
            }
            msg = "分组中添加或修改了" + hotels.size() + "个酒店,可能需要一点时间。";
            if(groupDto.getId() != 0){
                groupEntity.setId(groupDto.getId());
                updateById(groupEntity);
            }else {
                save(groupEntity);
            }
            for (DtUpHtlEntity h : hotels) {
                htlGroupEntity = new HtlGroupEntity();
                htlGroupEntity.setDtId(Integer.valueOf(groupDto.getDtId()));
                htlGroupEntity.setStoreId(Integer.valueOf(groupDto.getStorId()));
                htlGroupEntity.setGroupId(groupEntity.getId());
                htlGroupEntity.setGroupName(groupEntity.getGroupName());
                htlGroupEntity.setHotelId(h.getHotelId());
                htlGroupEntity.setBlonPlantform(Integer.valueOf(groupDto.getPf()));
                htlGroupEntity.setIsDel(0);
//                id = Long.valueOf(groupDto.getStorId() + groupEntity.getId().toString() + h.getHotelId().toString());
                id = Long.valueOf((h.getHotelId().toString() + groupDto.getStorId() + groupDto.getId().toString()));
                htlGroupEntity.setId(id);
                htlGroupEntities.add(htlGroupEntity);
            }
        }else {//添加指定酒店
            htlGroupEntities = Lists.newArrayList();

            if( groupDto.getHotelIds() == null ||  groupDto.getHotelIds().length <= 0){
                return  R.error("没有满足条件的酒店");
            }
            msg = "分组中添加或修改了" + groupDto.getHotelIds().length + "个酒店,可能需要一点时间。";
            if(groupDto.getId() != 0){
                groupEntity.setId(groupDto.getId());
                updateById(groupEntity);
            }else {
                save(groupEntity);
            }
            List<Long> hotelIds = htlGroupService.getHotelIdsByStoreId(Integer.valueOf(groupDto.getStorId()));
            for (String hid : groupDto.getHotelIds()){
                if(!hotelIds.contains(Long.valueOf(hid))){
                    htlGroupEntity = new HtlGroupEntity();
                    htlGroupEntity.setDtId(Integer.valueOf(groupDto.getDtId()));
                    htlGroupEntity.setStoreId(Integer.valueOf(groupDto.getStorId()));
                    htlGroupEntity.setGroupId(groupEntity.getId());
                    htlGroupEntity.setGroupName(groupDto.getGroupName());
                    htlGroupEntity.setHotelId(Long.valueOf(hid));
                    htlGroupEntity.setBlonPlantform(Integer.valueOf(groupDto.getPf()));
                    htlGroupEntity.setIsDel(0);
                    //id = Long.valueOf(groupDto.getStorId() + groupDto.getId().toString() + hid);
                    id = Long.valueOf((hid + groupDto.getStorId() + groupDto.getId().toString()));
                    htlGroupEntity.setId(id);
                    htlGroupEntities.add(htlGroupEntity);
                }
                DtUpHtlEntity dtUpHtlEntity = new DtUpHtlEntity();
                dtUpHtlEntity.setHotelId(Long.valueOf(hid));
                dtUpHtlEntity.setId(Long.valueOf(hid + groupDto.getStorId()));
                dtUpHtlEntity.setDtId(Integer.valueOf(groupDto.getDtId()));
                dtUpHtlEntity.setStatus(-1);
                dtUpHtlEntity.setStoreId(Integer.valueOf(groupDto.getStorId()));
                dtUpHtlEntities.add(dtUpHtlEntity);

            }
        }
        return R.ok(msg).put("htl",htlGroupEntities).put("dthtl", dtUpHtlEntities);
    }

    @Async
    @Override
    public  void saveHtlGroup(List<HtlGroupEntity> htlGroupEntities){
//        htlGroupService.save(htlGroupEntities.get(0));
         htlGroupService.saveOrUpdateBatch(htlGroupEntities);
    }

    @Override
    public List<GroupEntity> selectByStoreId(Integer storeId) {
        return groupDao.selectByStoreId(storeId);
    }

    @Override
    public List<GroupEntity> getGrupByPfStoreId(Integer pf, Integer storeId) {
        return baseMapper.getGrupByPfStoreId(pf, storeId);
    }

}